/**
 * feiniu.com Inc.
 * Copyright (c) 2013-2014 All Rights Reserved.
 */
package com.wanxin.wb.common.support.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * <B>Description:</B> 扩展org.apache.commons.lang3.StringUtils <br>
 * <B>Create on:</B> 2014年12月16日 下午5:48:41<br>
 *
 * @author yuan.qin
 * @version 1.0
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {

    private static List<String> postfix_pic_remove = new ArrayList<>();
    static {
        postfix_pic_remove.add("_60x60");
        postfix_pic_remove.add("_800x800");
        postfix_pic_remove.add("_400x400");
        postfix_pic_remove.add("_org");
    }

    /**
     * Description: 将两端的空格去掉 中间的多个空格替换为一个空格
     *
     * @param str 字符串
     * @return
     */
    public static String replaceExtraBlank(String str) {
        if (isBlank(str)) {
            return EMPTY;
        }
        StringBuilder result = new StringBuilder();
        boolean flag = false;
        str = str.trim();
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                flag = false;
                result.append(str.charAt(i));
            } else if (!flag) {
                flag = true;
                result.append(str.charAt(i));
            }
        }
        return result.toString();
    }

    /**
     * Description:判断是否为null或""
     *
     * @param o
     * @return
     */
    public static boolean isEmpty(Object o) {
        if (o == null) {
            return true;
        }
        return isEmpty(o.toString());
    }

    public static boolean isNotEmpty(Object o) {
        return !isEmpty(o);
    }

    /**
     * Description:判断是否为null或空串
     *
     * @param o
     * @return
     */
    public static boolean isBlank(Object o) {
        if (o == null) {
            return true;
        }
        return isBlank(o.toString());
    }

    public static boolean isNotBlank(Object o) {
        return !isBlank(o);
    }

    public static String toStringIgnoreNull(Object o) {
        if (o == null) {
            return "";
        }
        return o.toString();
    }

    /**
     * <B>Description:</B> 布尔值转换为0或1 <br>
     * <B>Create on:</B> 2015年1月13日 上午9:24:57<br>
     *
     * @param bool
     * @return
     * @author yuan.qin
     */
    public static String getBoolean(Boolean bool) {
        if (bool == null) {
            return null;
        } else if (bool) {
            return "1";
        } else {
            return "0";
        }
    }

    /**
     * <B>Description:</B> 0和1转换为布尔类型(非0和1返回null) <br>
     * <B>Create on:</B> 2015年1月13日 上午9:27:12<br>
     *
     * @param bool
     * @return
     * @author yuan.qin
     */
    public static Boolean getBoolean(String bool) {
        if (isEmpty(bool)) {
            return null;
        } else if ("1".equals(bool)) {
            return true;
        } else if ("0".equals(bool)) {
            return false;
        }
        return null;
    }

    /**
     * <B>Description:</B> 删除末尾某个字符<br>
     * <B>Create on:</B> 2015年1月26日 下午7:27:54<br>
     *
     * @param str
     * @return
     * @author xiaojun.song
     */
    public static String trimEnd(String str, String end) {
        if (isBlank(str)) {
            return EMPTY;
        }
        str = str.trim();
        String endStr = str.substring(str.length() - 1);
        if (endStr.equals(end)) {
            str = str.substring(0, str.length() - 1);
        }
        return str;
    }

    /**
     * 将错误信息分行连接在一起
     *
     * @param errorMessage
     * @return
     */
    public static String joinErrorMessages(String... errorMessage) {
        List<String> list = new ArrayList<String>();
        for (String s : errorMessage) {
            if (isNotBlank(s))
                list.add(s);
        }
        if (list.isEmpty())
            return "";
        return StringUtils.join(list, "\t");
    }

    /**
     * 
     * <B>Description:</B> 等于其中一个(注意:单个为null,直接返回false;数组中如果有null会被忽略)<br>
     * <B>Create on:</B> 2015年7月1日 上午11:39:58<br>
     *
     * @param str
     * @param args 不能为null
     * @return 
     * @author yuan.qin
     */
    public static boolean equalsOne(String str, String... args) {
        if (str != null) {
            for (String arg : args) {
                if (arg != null && arg.equals(str)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 
     * <B>Description:是否正整数字</B> <br>
     * <B>Create on:</B> 2015年10月16日 下午7:23:59<br>
     *
     * @param str
     * @return 
     * @author xiaojun.song
     */
    public static boolean isIntNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        return pattern.matcher(str).matches();
    }

    //截取指定长度+
    public static String subStrLen(String str, int len) {
        if (isBlank(str)) {
            return EMPTY;
        }
        str = str.trim();
        int totalLen = str.length();
        if (len > totalLen) {
            return str;
        }
        return str.substring(0, len - 1);
    }

    public static boolean isNumeric(String str) {

        Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]+");
        return pattern.matcher(str).matches() || isIntNumeric(str);
    }

    public static String nvl(String data) {
        return nvl(data, "");
    }

    public static String nvl(String data, String defVal) {
        if (data == null) {
            return defVal;
        }
        return data;
    }

    public static boolean isLetter(char c) {
        int k = 0x80;
        return c / k == 0 ? true : false;
    }

    /** 
     * 判断字符串是否为空 
     * @param str 
     * @return 
     */
    public static boolean isNull(String str) {
        if (str == null || str.trim().equals("") || str.trim().equalsIgnoreCase("null")) {
            return true;
        } else {
            return false;
        }
    }

    /**  
        * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1  
        * @param String s 需要得到长度的字符串  
        * @return int 得到的字符串长度  
        */
    public static int length(String s) {
        if (s == null)
            return 0;
        char[] c = s.toCharArray();
        int len = 0;
        for (int i = 0; i < c.length; i++) {
            len++;
            if (!isLetter(c[i])) {
                len++;
            }
        }
        return len;
    }

    /**  
     * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为1,英文字符长度为0.5  
     * @param String s 需要得到长度的字符串  
     * @return int 得到的字符串长度  
     */
    public static int getDBLength(String s) {
        if (isEmpty(s)) {
            return 0;
        }
        double valueLength = 0;
        String chinese = "[\u4e00-\u9fa5]";
        // 获取字段值的长度，如果含中文字符，则每个中文字符长度为2，否则为1    
        for (int i = 0; i < s.length(); i++) {
            // 获取一个字符    
            String temp = s.substring(i, i + 1);
            // 判断是否为中文字符    
            if (temp.matches(chinese)) {
                // 中文字符长度为3    
                valueLength += 3;
            } else {
                // 其他字符长度为0.5    
                valueLength += 1;
            }
        }
        //进位取整    
        return Double.valueOf(Math.ceil(valueLength)).intValue();
    }

    public static void main(String[] agrs) {
        String str = "1";
    

    }

    public static String removePicPostfix(String picUrl) {
        if (StringUtils.isEmpty(picUrl)) {
            return null;
        }
        for (String post_pic : postfix_pic_remove) {
            picUrl = picUrl.replace(post_pic, "");
        }
        return picUrl;

    }

    /**
     * <B>Description:</B> 格式化JSON,返回页面显示用 <br>
     * <B>Create on:</B> 2016/5/11 11:11 <br>
     *
     * @author xiangyu.ye
     */
    public static String formatJson(String jsonStr) {
        if (null == jsonStr || "".equals(jsonStr))
            return "";
        StringBuilder sb = new StringBuilder();
        char last = '\0';
        char current = '\0';
        int indent = 0;
        for (int i = 0; i < jsonStr.length(); i++) {
            last = current;
            current = jsonStr.charAt(i);
            switch (current) {
                case '{':
                case '[':
                    sb.append(current);
                    sb.append('\n');
                    indent++;
                    addIndentBlank(sb, indent);
                    break;
                case '}':
                case ']':
                    sb.append('\n');
                    indent--;
                    addIndentBlank(sb, indent);
                    sb.append(current);
                    break;
                case ',':
                    sb.append(current);
                    if (last != '\\') {
                        sb.append('\n');
                        addIndentBlank(sb, indent);
                    }
                    break;
                default:
                    sb.append(current);
            }
        }

        return sb.toString();
    }
    /**
     * <B>Description:</B> 添加space <br>
     * <B>Create on:</B> 2016/5/11 11:13 <br>
     *
     * @author xiangyu.ye
     */
    private static void addIndentBlank(StringBuilder sb, int indent) {
        for (int i = 0; i < indent; i++) {
            sb.append('\t');
        }
    }
}
